Матч 236, Бизнес задания (BusinessTasks)

Дивизион 2, Уровень 2; Дивизион 1, Уровень 1

 

Список list содержит набор заданий, которые должен выполнить бизнесмен. Для того, чтобы решить какое задание выполнять первым, он совершает следующую процедуру. Все задания располагаются в циклическом списке, то есть после последнего задания идет первый. Бизнесмен выбирает некоторое натуральное число n. Начиная с первого элемента, он считает по часовой стрелке до тех пор, пока не дойдет до n - ого задания, которое удаляет из списка. Затем счет продолжается по часовой стрелке, начиная со следующего после удаленного элемента. Процесс счета и удаления продолжается до тех пор, пока в списке не останется одно задание. Оно и выполняется первым.

По заданному списку заданий list и числу n следует найти  задание, которое будет выполняться первым.

 

Класс: BusinessTasks

Метод: string getTask(vector<string> list, int n)

Ограничения: list содержит от 2 до 50 элементов, list[i] содержит от 1 до 50 символов ‘a’ – ‘z’, 1 £ n £ 10000000.

 

Вход. Массив list, содержащий набор заданий и число n.

 

Выход. Первое задание, которое будет выполнять бизнесмен согласно описанной в условии процедуре выбора.

 

Пример входа

list

n

{"a","b","c","d"}

2

{"a","b","c","d","e"}

3

{"alpha","beta","gamma","delta","epsilon"}

1

 

Пример выхода

"a"

"d"

"epsilon"

 

 

РЕШЕНИЕ

обработка массива + моделирование

 

Задачу будем решать, моделируя описанный процесс подсчета и удаления заданий. С учетом того, что значение n может быть велико, следует воспользоваться правилом:

Если имеется k заданий, пронумерованных от 0 до k – 1, счет продолжается до n, а отсчет начинается с i - ого задания, то следующее удаляемое задание имеет номер (i + n) % k.

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

#include <string>

using namespace std;

 

class BusinessTasks

{

public:

  string getTask(vector<string> list, int n)

  {

    int i, j, size = list.size();

    n--;

    for(j = i = 0; i < size - 1; i++)

    {

      j = (j + n) % list.size();

      list.erase(list.begin() + j);

    }

    return list[0];

  }

};